package com.gitee.zhziyun.cnfsystem.utils.FileUtil;

import java.io.*;

/**
 * <p>断点续传状态管理工具<p/>
 * <p><p/>
 * <p>功能：<p/>
 * <p>1. 保存传输状态到隐藏文件<p/>
 * <p>2. 加载未完成的传输状态<p/>
 * <p>3. 清理已完成的状态记录<p/>
 */
public class ResumableFileTransfer {
    private static final String STATUS_FILE_SUFFIX = ".transfer_status";
    private static final String TEMP_FILE_SUFFIX = ".tmp";

    /**
     * 保存传输状态
     * @param filePath 原始文件路径
     * @param position 已传输字节数
     */
    public static void saveTransferStatus(String filePath, long position) {
        File statusFile = getStatusFile(filePath);
        try (DataOutputStream dos = new DataOutputStream(
                new FileOutputStream(statusFile))) {
            dos.writeUTF(filePath);
            dos.writeLong(position);
        } catch (IOException e) {
            System.err.println("保存状态失败: " + e.getMessage());
        }
    }

    /**
     * 加载传输状态
     * @return 传输状态对象，没有则返回null
     */
    public static TransferStatus loadTransferStatus(String filePath) {
        File statusFile = getStatusFile(filePath);
        if (!statusFile.exists()) return null;

        try (DataInputStream dis = new DataInputStream(
                new FileInputStream(statusFile))) {
            return new TransferStatus(dis.readUTF(), dis.readLong());
        } catch (IOException e) {
            return null;
        }
    }

    /**
     * 清理状态文件
     */
    public static void clearTransferStatus(String filePath) {
        File statusFile = getStatusFile(filePath);
        statusFile.delete();

        // 清理临时文件
        if (filePath != null) {
            File tempDir = new File(filePath).getParentFile();
            if (tempDir != null) {
                File[] tempFiles = tempDir.listFiles((dir, name) ->
                        name.endsWith(TEMP_FILE_SUFFIX));
                if (tempFiles != null) {
                    for (File f : tempFiles) f.delete();
                }
            }
        }
    }

    /**
     * 获取状态文件对象
     */
    private static File getStatusFile(String filePath) {
        return new File(filePath + STATUS_FILE_SUFFIX);
    }

    /**
     * 传输状态记录
     */
    public static class TransferStatus {
        public final String filePath;
        public final long position;

        public TransferStatus(String filePath, long position) {
            this.filePath = filePath;
            this.position = position;
        }
    }
}